home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / mus / edit / AlgoRhythms.lha / AlgoRhythms / Source / scales.c < prev    next >
C/C++ Source or Header  |  1994-11-25  |  7KB  |  239 lines

  1. /* Scales.c
  2.     Copyright (c) 1990,1991,1992,1993 by Thomas E. Janzen
  3.     All Rights Reserved
  4.  
  5.     THIS SOFTWARE IS FURNISHED FREE OF CHARGE FOR STUDY AND USE AND MAY
  6.     BE COPIED ONLY FOR PERSONAL USE OR COMPLETELY AS OFFERED WITH NO
  7.     CHANGES FOR FREE DISTRIBUTION.  NO TITLE TO AND OWNERSHIP OF THE
  8.     SOFTWARE IS HEREBY TRANSFERRED.  THOMAS E. JANZEN ASSUMES NO 
  9.     RESPONSIBILITY FOR THE USE OR RELIABILITY OF THIS SOFTWARE.
  10.     
  11.     Thomas E. Janzen
  12.     208A Olde Derby Road
  13.     Norwood, MA  02062-1761
  14.     (617)769-7733
  15.  
  16. **  FACILITY:
  17. **
  18. **    AlgoRhythms music improviser on Commodore (TM) Amiga (TM)
  19. **    compiled with SAS/C Amiga Compiler 6.50 
  20. **
  21. **  ABSTRACT:
  22. **
  23. **    Scales.c creates and manages musical scales.
  24. **
  25. **  AUTHORS: Thomas E. Janzen
  26. **
  27. **  CREATION DATE:    26-MAR-1990
  28. **
  29. **  MODIFICATION HISTORY:
  30. **    DATE    NAME    DESCRIPTION
  31. **    7 Dec 90 T. Janzen Procedurized filling octave-repeating scales
  32. **  4 Jan 92 TEJ  last changes for 2.0
  33. **  2 MAR 92 TEJ  Use scale_list.h
  34. **--
  35. */
  36. #include <stdlib.h>  /* needed for ANSI abs () */
  37. #include <math.h>
  38. #include "scale_list.h"
  39. #include "Scales.h"
  40.  
  41. #define NUMOCTAVES      7
  42. #define BOTTOMOCT       2
  43.  
  44. static int octave_repeat_scale(const unsigned char *one_octave_scale, 
  45.                                int *scale, 
  46.                                const int scale_octave_len);
  47.  
  48. int install_scale(const int select, int *scale) 
  49. /*
  50. ** FUNCTIONAL DESCRIPTION:
  51. **  Puts a selected scale into the global current musical scale
  52. **
  53. ** RETURN VALUE:
  54. **      description: length of scale
  55. **        data_type: int
  56. **
  57. ** ARGUMENTS:
  58. **
  59. **  select-
  60. **         description: number of scale to install
  61. **           data_type: int 
  62. **              access: read only
  63. **
  64. **  scale-
  65. **         description: global scale array
  66. **           data_type: pointer to int
  67. **              access: write only
  68. **
  69. ** DESIGN:
  70. **  ROUTINE
  71. **  : IF select is in range
  72. **  : : temp_select = select
  73. **  : ELSE
  74. **  : : temp_select = 1
  75. **  : ENDIF
  76. **  : IF this is an octave-repeating scale
  77. **  : : install octave-repeating scale
  78. **  : ELSE
  79. **  : : install non-octave-repeating scale
  80. **  : ENDIF
  81. **  * RETURN scale_len
  82. **  ENDROUTINE
  83. */
  84. {
  85.     const static unsigned char  scale_1[SCALE_1_LEN] = SCALE_1_NOTES,
  86.                                 scale_2[SCALE_2_LEN] = SCALE_2_NOTES,
  87.                                 scale_3[SCALE_3_LEN] = SCALE_3_NOTES,
  88.                                 scale_4[SCALE_4_LEN] = SCALE_4_NOTES,
  89.                                 scale_5[SCALE_5_LEN] = SCALE_5_NOTES,
  90.                                 scale_6[SCALE_6_LEN] = SCALE_6_NOTES,
  91.                                 scale_7[SCALE_7_LEN] = SCALE_7_NOTES,
  92.                                 scale_8[SCALE_8_LEN] = SCALE_8_NOTES,
  93.                                 scale_9[SCALE_9_LEN] = SCALE_9_NOTES,
  94.                                 scale_10[SCALE_10_LEN] = SCALE_10_NOTES,
  95.                                 scale_11[SCALE_11_LEN] = SCALE_11_NOTES,
  96.                                 scale_12[SCALE_12_LEN] = SCALE_12_NOTES,
  97.                                 scale_13[SCALE_13_LEN] = SCALE_13_NOTES,
  98.                                 scale_14[SCALE_14_LEN] = SCALE_14_NOTES,
  99.                                 scale_15[SCALE_15_LEN] = SCALE_15_NOTES,
  100.                                 scale_16[SCALE_16_LEN] = SCALE_16_NOTES,
  101.                                 scale_17[SCALE_17_LEN] = SCALE_17_NOTES,
  102.                                 scale_18[SCALE_18_LEN] = SCALE_18_NOTES,
  103.                                 scale_19[SCALE_19_LEN] = SCALE_19_NOTES,
  104.                                 scale_20[SCALE_20_LEN] = SCALE_20_NOTES,
  105.                                 scale_21[SCALE_21_LEN] = SCALE_21_NOTES;
  106.     const static unsigned char *scales[C_SCALE_QTY] = 
  107.         {scale_1, scale_2, scale_3, scale_4, scale_5, scale_6, scale_7,
  108.         scale_8, scale_9, scale_10, scale_11, scale_12, scale_13, 
  109.         scale_14, scale_15, scale_16, scale_17, scale_18, scale_19, 
  110.         scale_20, scale_21}; 
  111.     const static unsigned int scale_oct[C_SCALE_QTY] 
  112.             = {SCALE_1_OCT, SCALE_2_OCT, SCALE_3_OCT, SCALE_4_OCT,
  113.             SCALE_5_OCT, SCALE_6_OCT, SCALE_7_OCT, SCALE_8_OCT,
  114.             SCALE_9_OCT, SCALE_10_OCT, SCALE_11_OCT, SCALE_12_OCT,
  115.             SCALE_13_OCT, SCALE_14_OCT, SCALE_15_OCT, SCALE_16_OCT,
  116.             SCALE_17_OCT, SCALE_18_OCT, SCALE_19_OCT, SCALE_20_OCT,
  117.             SCALE_21_OCT},
  118.         scale_lens[C_SCALE_QTY] 
  119.             = {SCALE_1_LEN, SCALE_2_LEN, SCALE_3_LEN, SCALE_4_LEN,
  120.             SCALE_5_LEN, SCALE_6_LEN, SCALE_7_LEN, SCALE_8_LEN,
  121.             SCALE_9_LEN, SCALE_10_LEN, SCALE_11_LEN, SCALE_12_LEN,
  122.             SCALE_13_LEN, SCALE_14_LEN, SCALE_15_LEN, SCALE_16_LEN,
  123.             SCALE_17_LEN, SCALE_18_LEN, SCALE_19_LEN, SCALE_20_LEN, 
  124.             SCALE_21_LEN};
  125.     auto int    index,
  126.                 scale_len,
  127.                 temp_select;
  128.  
  129.     if ((select > 0) && (select <= C_SCALE_QTY))
  130.     {
  131.         temp_select = select - 1;
  132.     }
  133.     else
  134.     {
  135.         temp_select = 0;
  136.     }
  137.     if (scale_oct[temp_select])
  138.     {
  139.         scale_len = octave_repeat_scale(scales[temp_select], scale,
  140.             scale_lens[temp_select]);
  141.     }
  142.     else
  143.     {
  144.         for (index = 0; index < scale_lens[temp_select]; index++)
  145.         {
  146.             scale[index] = (int)scales[temp_select][index];
  147.         }
  148.         scale_len = scale_lens[temp_select];
  149.     }
  150.     return scale_len;
  151. }
  152.  
  153. void transpose_scale(  const int transpose, int *scale, 
  154.                                         const int range) 
  155. /*
  156. ** FUNCTIONAL DESCRIPTION:
  157. **
  158. ** ARGUMENTS:
  159. **
  160. **  transpose-
  161. **         description: interval in semitones to transpose the scale
  162. **           data_type: int
  163. **              access: read only
  164. **
  165. **  scale-
  166. **         description: the global scale array
  167. **           data_type: pointer to int
  168. **              access: write only
  169. **
  170. **  range-
  171. **         description: length of scale
  172. **           data_type: int
  173. **              access: read only
  174. **
  175. ** DESIGN:
  176. **  ROUTINE
  177. **  : IF transposition magnitude is under 12
  178. **  : : FOR length of scale
  179. **  : : : transpose each scale element
  180. **  : : ENDFOR
  181. **  ENDROUTINE
  182. */
  183. {
  184.     register int i;
  185.     
  186.     if (abs(transpose) < 12) 
  187.     {
  188.         for (i = 0; i < range; i++)
  189.         {
  190.             scale[i] = scale[i] + transpose;
  191.         }
  192.     }
  193.     return;
  194. }
  195.  
  196. static int octave_repeat_scale(const unsigned char *one_octave_scale, 
  197.                                 int *scale, 
  198.                                 const int scale_octave_len)
  199. /*
  200. ** FUNCTIONAL DESCRIPTION:
  201. **
  202. ** RETURN VALUE:
  203. **      description: 
  204. **        data_type: 
  205. **
  206. ** ARGUMENTS:
  207. **
  208. **  one_octave_scale-
  209. **         description: one octave of the selected scale
  210. **           data_type: pointer to char
  211. **              access: read only
  212. **
  213. **  scale-
  214. **         description: global scale
  215. **           data_type: pointer to int
  216. **              access: write only
  217. **
  218. **  scale_octave_len-
  219. **         description: length of one octave of scale
  220. **           data_type: int
  221. **              access: read only
  222. **
  223. ** DESIGN:
  224. */
  225. {
  226.     auto int    oct,
  227.                 i;
  228.  
  229.     for (oct = 0; oct < NUMOCTAVES; oct++)
  230.     {
  231.         for (i = 0; i < scale_octave_len; i++)
  232.         {
  233.             scale[i + (oct * scale_octave_len)]   
  234.                     = (int)one_octave_scale[i] + ((oct + BOTTOMOCT) * 12);
  235.         }
  236.     }
  237.     return (NUMOCTAVES * scale_octave_len);
  238. }
  239.